/**
 * @file snakegamewidget.h
 * @brief Snake游戏主界面窗口类头文件
 *
 * SnakeGameWidget是Snake游戏的主界面窗口，负责：
 * - 整合游戏的所有UI组件
 * - 管理游戏界面的布局和导航
 * - 处理用户交互和游戏控制
 * - 协调游戏管理器和渲染器
 * - 提供完整的游戏用户体验
 */

#ifndef SNAKEGAMEWIDGET_H
#define SNAKEGAMEWIDGET_H

#include <QWidget>              // Qt窗口部件基类
#include <QVBoxLayout>          // 垂直布局
#include <QHBoxLayout>          // 水平布局
#include <QStackedWidget>       // 堆叠窗口部件
#include <QPushButton>          // 按钮
#include <QLabel>               // 标签
#include <QLineEdit>            // 单行编辑框
#include <QTextEdit>            // 多行编辑框
#include <QListWidget>          // 列表窗口部件
#include <QComboBox>            // 组合框
#include <QSpinBox>             // 数字选择框
#include <QCheckBox>            // 复选框
#include <QGroupBox>            // 分组框
#include <QSplitter>            // 分割器
#include <QTimer>               // 定时器
#include <QStackedWidget>      // 堆叠窗口
#include <QKeyEvent>            // 键盘事件
#include "snakegamemanager.h"
#include "snakegamerenderer.h"
#include "singleplayergamewidget.h"
#include "snakecreateroomdialog.h"

/**
 * @class SnakeGameWidget
 * @brief Snake游戏主界面窗口类
 *
 * 作为Snake游戏的主要用户界面，整合所有游戏相关的UI组件，
 * 提供完整的游戏体验，包括大厅、游戏、设置等界面。
 */
class SnakeGameWidget : public QWidget
{
    Q_OBJECT  // 启用Qt元对象系统

public:
    /**
     * @enum GamePage
     * @brief 游戏页面枚举
     */
    enum GamePage {
        LobbyPage = 0,          ///< 游戏大厅页面
        GamePage_Playing,       ///< 游戏进行页面
        SinglePlayerPage,       ///< 单人游戏页面
        SettingsPage,           ///< 设置页面
        StatsPage               ///< 统计页面
    };
    Q_ENUM(GamePage)

    explicit SnakeGameWidget(QWidget *parent = nullptr);
    ~SnakeGameWidget();

    // === 初始化和配置 ===
    /**
     * @brief 初始化游戏界面
     * @param apiGatewayUrl API网关URL
     * @param accessToken 访问令牌
     * @param playerId 玩家ID
     * @param playerName 玩家名称
     */
    void initialize(const QString &apiGatewayUrl, const QString &accessToken,
                   const QString &playerId, const QString &playerName);

    /**
     * @brief 使用WebSocket直接初始化游戏组件（新业务流程）
     * @param websocketUrl WebSocket服务器URL
     * @param gameToken 游戏认证令牌
     * @param playerId 玩家ID
     * @param playerName 玩家名称
     */
    void initializeWithWebSocket(const QString &websocketUrl, const QString &gameToken,
                                const QString &playerId, const QString &playerName);

    /**
     * @brief 显示游戏界面
     */
    void showGame();

    /**
     * @brief 隐藏游戏界面
     */
    void hideGame();

    // === 页面导航 ===
    /**
     * @brief 切换到指定页面
     * @param page 目标页面
     */
    void switchToPage(GamePage page);

    /**
     * @brief 获取当前页面
     * @return 当前页面
     */
    GamePage getCurrentPage() const;

    /**
     * @brief 应用与主界面统一的主题样式
     *
     * 确保Snake游戏界面与主页面使用一致的颜色方案和样式
     */
    void applyUnifiedTheme();

    /**
     * @brief 获取游戏管理器
     * @return 游戏管理器指针
     */
    SnakeGameManager* getGameManager() const { return m_gameManager; }

    // === 游戏控制 ===
    /**
     * @brief 连接到游戏服务器
     * @param region 首选地区
     */
    void connectToGameServer(const QString &region = QString());

    /**
     * @brief 断开游戏服务器连接
     */
    void disconnectFromGameServer();

    /**
     * @brief 创建游戏房间
     */
    void createGameRoom();

    /**
     * @brief 加入游戏房间
     * @param roomId 房间ID
     */
    void joinGameRoom(const QString &roomId);

    /**
     * @brief 离开游戏房间
     */
    void leaveGameRoom();

    // === 状态查询 ===
    /**
     * @brief 是否已连接到游戏
     * @return true表示已连接
     */
    bool isConnectedToGame() const;

    /**
     * @brief 是否在游戏中
     * @return true表示在游戏中
     */
    bool isInGame() const;

signals:
    /**
     * @brief 游戏界面关闭信号
     */
    void gameClosed();

    /**
     * @brief 返回大厅请求信号
     */
    void backToLobbyRequested();

    /**
     * @brief 返回主菜单信号
     */
    void backToMainMenu();

    /**
     * @brief 游戏状态改变信号
     * @param connected 是否已连接
     * @param inGame 是否在游戏中
     */
    void gameStateChanged(bool connected, bool inGame);

protected:
    // === Qt事件处理 ===
    void keyPressEvent(QKeyEvent *event) override;
    void keyReleaseEvent(QKeyEvent *event) override;
    void closeEvent(QCloseEvent *event) override;
    void showEvent(QShowEvent *event) override;
    void hideEvent(QHideEvent *event) override;

private slots:
    // === 游戏管理器事件处理 ===
    void onConnectionStatusChanged(SnakeGameManager::ConnectionStatus status);
    void onGameServersReceived(const QList<SnakeApiClient::GameServerInfo> &servers);
    void onGameLoginSucceeded(const SnakeApiClient::GameLoginResult &loginResult);
    void onGameLoginFailed(const QString &error);
    void onRoomListReceived(const QList<SnakeApiClient::RoomInfo> &rooms);
    void onRoomCreated(const SnakeApiClient::RoomInfo &roomInfo);
    void onRoomJoined(const QString &roomId);
    void onRoomLeft();
    void onGameStarted();
    void onGameEnded(const QJsonObject &results);
    void onPlayerJoined(const QString &playerId, const QString &playerName);
    void onPlayerLeft(const QString &playerId);
    void onChatMessageReceived(const QString &senderId, const QString &senderName, const QString &message);
    void onPlayerStatsReceived(const SnakeApiClient::PlayerStats &stats);
    void onLeaderboardReceived(const QJsonArray &leaderboard, const QString &type);

    // === UI事件处理 ===
    void onConnectButtonClicked();
    void onDisconnectButtonClicked();
    void onCreateRoomButtonClicked();
    void onJoinRoomButtonClicked();
    void onLeaveRoomButtonClicked();
    void onRefreshRoomsButtonClicked();
    void onSendChatButtonClicked();
    void onSettingsButtonClicked();
    void onStatsButtonClicked();
    void onBackToLobbyButtonClicked();

    // === 单人游戏槽函数 ===
    void onSinglePlayerDirectionChanged(int direction);
    void onSinglePlayerPauseRequested();
    void onSinglePlayerResumeRequested();
    void onSinglePlayerRestartRequested();
    void onSinglePlayerExitRequested();
    void onGameStateUpdatedForSinglePlayer();
    void onConnectionDetailsButtonClicked();
    void onConnectionError(const QString &error);
    void onRoomSelectionChanged();
    void onChatInputReturnPressed();

    // === 定时器事件处理 ===
    void onStatusUpdateTimer();
    void onRoomListRefreshTimer();

private:
    // === 核心组件 ===
    SnakeGameManager *m_gameManager;    ///< 游戏管理器
    SnakeGameRenderer *m_gameRenderer;  ///< 游戏渲染器
    SinglePlayerGameWidget *m_singlePlayerWidget; ///< 单人游戏组件

    // === 主要布局 ===
    QHBoxLayout *m_mainLayout;          ///< 主布局（左右布局）
    QStackedWidget *m_stackedWidget;    ///< 堆叠窗口部件（保持兼容性）

    // === 主面板 ===
    QWidget *m_leftPanel;               ///< 左侧面板
    QWidget *m_rightPanel;              ///< 右侧面板

    // === 左侧面板布局 ===
    QVBoxLayout *m_leftPanelLayout;     ///< 左侧面板主布局（垂直布局）
    QWidget *m_leftLeftPanel;           ///< 左侧面板的左部分
    QWidget *m_leftRightPanel;          ///< 左侧面板的右部分

    // === 右侧面板布局 ===
    QVBoxLayout *m_rightPanelLayout;    ///< 右侧面板主布局（上中下分割）
    QWidget *m_rightTopPanel;           ///< 右侧面板的上部分
    QWidget *m_rightMiddlePanel;        ///< 右侧面板的中部分
    QWidget *m_rightBottomPanel;        ///< 右侧面板的下部分

    // === 页面窗口部件 ===
    QWidget *m_lobbyWidget;             ///< 大厅页面
    QWidget *m_gameWidget;              ///< 游戏页面
    QWidget *m_settingsWidget;          ///< 设置页面
    QWidget *m_statsWidget;             ///< 统计页面

    // === 大厅界面组件 ===
    QVBoxLayout *m_lobbyLayout;         ///< 大厅布局
    QHBoxLayout *m_connectionLayout;    ///< 连接布局
    QLabel *m_connectionStatusLabel;    ///< 连接状态标签
    QPushButton *m_connectButton;       ///< 连接按钮
    QPushButton *m_disconnectButton;    ///< 断开连接按钮
    QComboBox *m_regionComboBox;        ///< 地区选择框

    QGroupBox *m_roomGroupBox;          ///< 房间分组框
    QVBoxLayout *m_roomLayout;          ///< 房间布局
    QHBoxLayout *m_roomControlLayout;   ///< 房间控制布局
    QPushButton *m_createRoomButton;    ///< 创建房间按钮
    QPushButton *m_joinRoomButton;      ///< 加入房间按钮
    QPushButton *m_refreshRoomsButton;  ///< 刷新房间按钮
    QListWidget *m_roomListWidget;      ///< 房间列表

    // === 游戏界面组件 ===
    QHBoxLayout *m_gameLayout;          ///< 游戏布局
    QSplitter *m_gameSplitter;          ///< 游戏分割器
    QWidget *m_gameControlWidget;       ///< 游戏控制面板
    QVBoxLayout *m_gameControlLayout;   ///< 游戏控制布局

    QGroupBox *m_gameInfoGroupBox;      ///< 游戏信息分组框
    QVBoxLayout *m_gameInfoLayout;      ///< 游戏信息布局
    QLabel *m_roomIdLabel;              ///< 房间ID标签
    QLabel *m_playerCountLabel;         ///< 玩家数量标签
    QLabel *m_gameStatusLabel;          ///< 游戏状态标签
    QLabel *m_scoreLabel;               ///< 分数标签
    QLabel *m_lengthLabel;              ///< 长度标签

    QGroupBox *m_chatGroupBox;          ///< 聊天分组框
    QVBoxLayout *m_chatLayout;          ///< 聊天布局
    QTextEdit *m_chatDisplayEdit;       ///< 聊天显示框
    QHBoxLayout *m_chatInputLayout;     ///< 聊天输入布局
    QLineEdit *m_chatInputEdit;         ///< 聊天输入框
    QPushButton *m_sendChatButton;      ///< 发送聊天按钮

    QPushButton *m_leaveRoomButton;     ///< 离开房间按钮
    QPushButton *m_backToLobbyButton;   ///< 返回大厅按钮

    // === WebSocket连接验证组件 ===
    QLabel *m_connectionStatusIcon;     ///< 连接状态图标
    QLabel *m_connectionStatusText;     ///< 连接状态文本
    QPushButton *m_connectionDetailsButton; ///< 连接详情按钮

    // === 新业务流程的连接信息 ===
    QString m_websocketUrl;             ///< WebSocket服务器URL
    QString m_gameToken;                ///< 游戏认证令牌
    QString m_playerId;                 ///< 玩家ID
    QString m_playerName;               ///< 玩家名称

    // === 设置界面组件 ===
    QVBoxLayout *m_settingsLayout;      ///< 设置布局
    QGroupBox *m_renderSettingsGroupBox; ///< 渲染设置分组框
    QComboBox *m_themeComboBox;         ///< 主题选择框
    QComboBox *m_renderModeComboBox;    ///< 渲染模式选择框
    QSpinBox *m_cellSizeSpinBox;        ///< 单元格大小选择框
    QCheckBox *m_animationsCheckBox;    ///< 动画复选框
    QCheckBox *m_particlesCheckBox;     ///< 粒子效果复选框
    QCheckBox *m_gridCheckBox;          ///< 网格复选框

    // === 统计界面组件 ===
    QVBoxLayout *m_statsLayout;         ///< 统计布局
    QLabel *m_playerStatsLabel;         ///< 玩家统计标签
    QTextEdit *m_leaderboardEdit;       ///< 排行榜显示框

    // === 状态管理 ===
    GamePage m_currentPage;             ///< 当前页面
    QString m_currentRoomId;            ///< 当前房间ID
    QList<SnakeApiClient::RoomInfo> m_availableRooms; ///< 可用房间列表

    // === 定时器 ===
    QTimer *m_statusUpdateTimer;        ///< 状态更新定时器
    QTimer *m_roomListRefreshTimer;     ///< 房间列表刷新定时器

    // === 私有方法 ===
    void setupUI();

    // === 面板设置方法 ===
    void setupLeftPanel();              ///< 设置左侧面板（单人模式优化）
    void setupRightPanel();             ///< 设置右侧面板
    void setupRoomListPanel();          ///< 设置房间列表面板
    void setupRoomOperationsPanel();    ///< 设置房间操作面板
    void setupBackToLobbyButton();      ///< 设置返回大厅按钮
    void setupWebSocketConnectionVerification(); ///< 设置WebSocket连接验证
    QString getWebSocketConnectionDetails();     ///< 获取WebSocket连接详情
    void connectToWebSocketAndAuthenticate();    ///< 连接WebSocket并认证
    void setupRightTopPanel();          ///< 设置右侧面板的上部分
    void setupRightMiddlePanel();       ///< 设置右侧面板的中部分
    void setupRightBottomPanel();       ///< 设置右侧面板的下部分

    // === 页面设置方法（保持兼容性）===
    void setupLobbyPage();
    void setupGamePage();
    void setupSinglePlayerPage();
    void setupSettingsPage();
    void setupStatsPage();
    void setupConnections();
    void updateConnectionStatus();
    void updateRoomList();
    void updateGameInfo();
    void updatePlayerStats();
    void addChatMessage(const QString &sender, const QString &message, const QColor &color = Qt::black);
    void showErrorMessage(const QString &title, const QString &message);
    void showInfoMessage(const QString &title, const QString &message);
    void applySettings();
    void loadSettings();
    void saveSettings();
};

#endif // SNAKEGAMEWIDGET_H
